package qc.common.core.enums.qms;

import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * QMS点号时段类型枚举，一个点号包含多种时段类型
 *
 * @author QuCheng Tech
 * @since 2025/8/21
 */
@Getter
@AllArgsConstructor
public enum QmsPointTimeSegmentEnum {
    UN_DEFINE(0, "未定义"),
    REAL(1, "实时"),
    MINUTE(2, "分钟"),//分钟点号暂时表示与实时点号相同含义，后续可以区分实时点号可以精确到毫秒
    HOUR(4, "小时"),
    DAY(8, "天"),
    WEEK(16, "周"),
    TEN_DAYS(32, "旬"),
    MONTH(64, "月"),
    QUARTER(128, "季度"),
    YEAR(256, "年");

    @EnumValue
    private int index;
    private String name;

    @Override
    public String toString() {
        if (this != null)
            return this.name;

        return null;
    }

    /**
     * 根据int型数值获取对应的枚举
     *
     * @param index 数值
     * @return qc.common.core.enums.qms.QmsPointTimeSegmentEnum
     * @author QuCheng Tech
     * @since 2025/9/26
     */
    public static QmsPointTimeSegmentEnum getQmsPointTimeSegmentEnum(Integer index) {
        if (index != null && index > 0x0) {
            for (QmsPointTimeSegmentEnum item : QmsPointTimeSegmentEnum.values()) {
                if (item.getIndex() == index) {//判断序号使用getIndex，判断内容使用getName
                    return item;
                }
            }
        }
        return QmsPointTimeSegmentEnum.UN_DEFINE;
    }

    /**
     * 获取比指定的时段类型小一个的时段类型，全部时段类型为对应枚举值之和
     *
     * @param tmsegs 全部时段类型枚举值之和
     * @param seg    指定的时段类型
     * @return qc.common.core.enums.qms.QmsPointTimeSegmentEnum
     * @author QuCheng Tech
     * @since 2025/9/22
     */
    public static QmsPointTimeSegmentEnum getSmallerOneTimeSegmentEnum(Integer tmsegs, QmsPointTimeSegmentEnum seg) {
        if (tmsegs != null && tmsegs.intValue() > 0x0) {
            //固定使用以下对应关系：年--月、月--日、日--小时、小时--实时
            QmsPointTimeSegmentEnum result = QmsPointTimeSegmentEnum.UN_DEFINE;

            //年、季度的小一个时段为月 
            if (seg == QmsPointTimeSegmentEnum.YEAR || seg == QmsPointTimeSegmentEnum.QUARTER) {
                result = QmsPointTimeSegmentEnum.MONTH;
                if ((tmsegs.intValue() & result.getIndex()) == result.index)
                    return result;
                else//如果输入的时段类型之和数值中不包含月时段类型，设置获取月的小一个时段类型
                    seg = QmsPointTimeSegmentEnum.MONTH;
            }

            //月、旬、周的小一个时段为日
            if (seg == QmsPointTimeSegmentEnum.MONTH || seg == QmsPointTimeSegmentEnum.TEN_DAYS || seg == QmsPointTimeSegmentEnum.WEEK) {
                result = QmsPointTimeSegmentEnum.DAY;
                if ((tmsegs.intValue() & result.getIndex()) == result.index)
                    return result;
                else//如果输入的时段类型之和数值中不包含日时段类型，设置获取日的小一个时段类型
                    seg = QmsPointTimeSegmentEnum.DAY;
            }

            //日的小一个时段为小时
            if (seg == QmsPointTimeSegmentEnum.DAY) {
                result = QmsPointTimeSegmentEnum.HOUR;
                if ((tmsegs.intValue() & result.getIndex()) == result.index)
                    return result;
                else//如果输入的时段类型之和数值中不包含小时时段类型，设置获取小时的小一个时段类型
                    seg = QmsPointTimeSegmentEnum.HOUR;
            }

            //小时、分钟的小一个时段为实时
            if (seg == QmsPointTimeSegmentEnum.HOUR || seg == QmsPointTimeSegmentEnum.MINUTE) {
                result = QmsPointTimeSegmentEnum.REAL;
                if ((tmsegs.intValue() & result.getIndex()) == result.index)
                    return result;
                else//如果输入的时段类型之和数值中不包含实时时段类型，返回UN_DEFINE
                    return QmsPointTimeSegmentEnum.UN_DEFINE;
            }
        }

        return QmsPointTimeSegmentEnum.UN_DEFINE;
    }
}
